/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.padrao.presenter;

import br.com.webhomesites.locacao.presenter.DevolucaoPresenter;
import br.com.webhomesites.locacao.presenter.LocacaoPresenter;
import br.com.webhomesites.padrao.model.BuscarProdutoModel;
import br.com.webhomesites.padrao.model.ProdutoDAO;
import br.com.webhomesites.padrao.model.ProdutoModel;
import br.com.webhomesites.padrao.presenter.BuscarProdutoPresenterActionListeners.BuscarActionListener;
import br.com.webhomesites.padrao.presenter.BuscarProdutoPresenterActionListeners.BuscarFocusListener;
import br.com.webhomesites.padrao.utils.Strategy;
import br.com.webhomesites.padrao.view.BuscarProdutoView;
import java.text.DecimalFormat;

/**
 *
 * @author Webhome
 */
public class BuscarProdutoPresenter {

    ProdutoPresenter produtoPresenter;
    LocacaoPresenter locacaoPresenter;
    DevolucaoPresenter devolucaoPresenter;
    ComposicaoProdutoPresenter composicaoProdutoPresenter;
    
    ProdutoModel produtoModel = new ProdutoModel();
    ProdutoDAO produtoDAO = new ProdutoDAO();
    
    BuscarProdutoView buscarProdutoView;
    BuscarProdutoModel buscarProdutoModel;
       
    public final Strategy BUSCAR_STRATEGY = new BuscarStrategy();
    
    public final Strategy POR_CODIGO_STRATEGY = new CodigoStrategy();
    public final Strategy POR_DESCRICAO_STRATEGY = new DescricaoStrategy();
    public final Strategy POR_SERIE_STRATEGY = new SerieStrategy();    
    
    public final Strategy BUSCADOR_PRODUTO_VIEW = new ProdutoViewStrategy();
    public final Strategy BUSCADOR_LOCACAO_VIEW = new LocacaoViewStrategy();
    public final Strategy BUSCADOR_COMPOSICAO_PRODUTO_VIEW = new ComposicaoProdutoViewStrategy();
        
    private Strategy operacao = BUSCAR_STRATEGY;
    private Strategy tipoBusca;
    private Strategy buscador;
    
    DecimalFormat df = new DecimalFormat("###,###,###.00");
    DecimalFormat df2 = new DecimalFormat("###,###,###.0");
   
    public BuscarProdutoPresenter(ProdutoPresenter produtoPresenter, LocacaoPresenter locacaoPresenter, DevolucaoPresenter devolucaoPresenter, ComposicaoProdutoPresenter composicaoProdutoPresenter, BuscarProdutoView buscarProdutoView, BuscarProdutoModel buscarProdutoModel) {
        this.produtoPresenter = produtoPresenter;
        this.locacaoPresenter = locacaoPresenter;
        this.devolucaoPresenter = devolucaoPresenter;
        this.buscarProdutoModel = buscarProdutoModel;
        this.buscarProdutoView = buscarProdutoView;
        this.composicaoProdutoPresenter = composicaoProdutoPresenter;
       
    }
    
    public BuscarProdutoPresenter() {
        
    }

    public void setUpViewListeners() {
        buscarProdutoView.setBtnBuscarActionListener(new BuscarActionListener(this));
        buscarProdutoView.setCodigoFocusListener(new BuscarFocusListener(this));
        buscarProdutoView.setDescricaoFocusListener(new BuscarFocusListener(this));
        buscarProdutoView.setSerieFocusListener(new BuscarFocusListener(this));

    }

    public void updateModelFromView() {
        buscarProdutoModel.setCodigo(buscarProdutoView.getComboCodigo());
        buscarProdutoModel.setDescricao(buscarProdutoView.getComboDescricao());
        buscarProdutoModel.setSerie(buscarProdutoView.getComboSerie());
    }

    public void updateViewFromModel() {
        if (buscarProdutoModel != null) {
            buscarProdutoView.setComboCodigo(Long.toString(buscarProdutoModel.getCodigo()));
            buscarProdutoView.setComboDescricao(buscarProdutoModel.getDescricao());
            buscarProdutoView.setComboSerie(buscarProdutoModel.getSerie());
        } else {
            //buscarProdutoView.clearFields();
        }
    }

    public void novoBuscarProduto() {
        getTipoBusca().execute();
        //buscarProdutoModel = new DevolucaoTotComPagModel();
        System.out.println("Executando a busca");
        //updateModelLocacaoFromDTCPV();
//        List<UsuarioModel> usuarios = usuarioDAO.findAll();
//        for(UsuarioModel pessoa : usuarios){
//            System.out.println("Pessoa: " + pessoa.getNome());
//        }
//        System.out.println("----------------------------------");
//        usuarios = usuarioDAO.findByNome("hernane");
//        for(UsuarioModel pessoa : usuarios){
//            System.out.println("Pessoa: " + pessoa.getNome());
//        }
    }

    public void habilitarEdicao(boolean arg) {
//        buscarProdutoView.enableTxtValorTotalLocacao(arg);
//        buscarProdutoView.enableTxtValorDesconto(arg);
//        buscarProdutoView.enableTxtValorTotalPagar(arg);
//
//        buscarProdutoView.enableBtnCancelar(arg);
//        buscarProdutoView.enableBtnConfirmar(arg);
//        buscarProdutoView.enableBtnRecibo(arg);
    }
    
    public BuscarProdutoView getBuscarProdutoView() {
        return buscarProdutoView;
    }
    
    public BuscarProdutoModel getBuscarProdutoModel() {
        return buscarProdutoModel;
    }

    public void setBuscarProdutoView(BuscarProdutoView buscarProdutoView) {
        this.buscarProdutoView = buscarProdutoView;
    }

    public void setBuscarProdutoModel(BuscarProdutoModel buscarProdutoModel) {
        this.buscarProdutoModel = buscarProdutoModel;
    }
    
    public ProdutoPresenter getProdutoPresenter() {
        return produtoPresenter;
    }

    public void createView() {

        this.setUpViewListeners();
        this.habilitarEdicao(true);
        buscarProdutoView.packAndShow();
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    public Strategy getTipoBusca() {
        return tipoBusca;
    }

    public void setTipoBusca(Strategy tipoBusca) {
        this.tipoBusca = tipoBusca;
    }

    public Strategy getBuscador() {
        return buscador;
    }

    public void setBuscador(Strategy buscador) {
        this.buscador = buscador;
    }   

    private class BuscarStrategy implements Strategy {

        @Override
        public void execute() {            
            novoBuscarProduto();
        }
    }
    
    private class CodigoStrategy implements Strategy {

        @Override
        public void execute() {       
            produtoModel = produtoDAO.getById(buscarProdutoView.getComboCodigo());
            getBuscador().execute();
        }
    }
    
    private class DescricaoStrategy implements Strategy {

        @Override
        public void execute() {             
            produtoModel = produtoDAO.findByDescricaoUnica(buscarProdutoView.getComboDescricao());
            getBuscador().execute();
        }
    }
    
    private class SerieStrategy implements Strategy {

        @Override
        public void execute() {            
            produtoModel = produtoDAO.findBySerie(buscarProdutoView.getComboSerie());
            getBuscador().execute();
        }
    }
    
    private class ProdutoViewStrategy implements Strategy {

        @Override
        public void execute() {               
            produtoPresenter.setOperacao(produtoPresenter.UPDATE_STRATEGY);
            produtoPresenter.setModel(produtoModel);
            produtoPresenter.updateViewFromModel();
        }
    }
    
    private class LocacaoViewStrategy implements Strategy {

        @Override
        public void execute() {            
            ProdutoModel produtoModel = produtoPresenter.getDAO().findBySerie(buscarProdutoView.getComboSerie());
            getBuscador().execute();
        }
    }
    
    private class ComposicaoProdutoViewStrategy implements Strategy {

        @Override
        public void execute() {  
            System.out.println("Composição presenter: " + composicaoProdutoPresenter);
            System.out.println("Produto Model: " + produtoModel);
            composicaoProdutoPresenter.setOperacao(composicaoProdutoPresenter.UPDATE_STRATEGY);
            composicaoProdutoPresenter.setProdutoModel(produtoModel);            
            composicaoProdutoPresenter.updateViewComposicaoFromProdutoModel();
            composicaoProdutoPresenter.updateModelComposicaoProdutoFromView();
            ;
        }
    }
}
